package com.whalecloud.chart.service;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.whalecloud.chart.domain.DrawChartRequestDTO;
import com.whalecloud.chart.service.dto.SeriesValue;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

import java.io.File;
import java.util.UUID;

/**
 * @Description 我的绘图
 * @Author MarkAsh
 * @Date 2025/2/22
 **/
@Slf4j
@Data
public abstract class AbstractChartService implements ChartService{


    private DrawChartRequestDTO requestDTO;

    /**
     * 生成图片
     * @param chart 绘图对象
     * @return 图片文件
     */
    public File createChartImage(JFreeChart chart){
        try {
            File file = new File(UUID.randomUUID() + ".png");
            ChartUtils.saveChartAsPNG(file, chart, 760, 600);
            return file;
        }catch (Exception e) {
            log.error("生成文件失败：{}", e.getMessage(), e);
            throw new RuntimeException(e);
        }
    }

    /**
     * 创建数据集
     *
     * @param sourceData 源数据
     * @return 数据集
     */
    @Override
    public abstract DefaultCategoryDataset createDataset(JSONArray sourceData);

    /**
     * 创建序列数据集
     * @param sourceData 源数据
     * @return 数据集
     */
    protected XYSeriesCollection createSeriesDataset(JSONArray sourceData) {
        XYSeriesCollection dataset = new XYSeriesCollection();
        XYSeries data = new XYSeries(StrUtil.blankToDefault(requestDTO.getXLabel(), "X"));
        sourceData.forEach(item -> {
            SeriesValue plotValue = JSONObject.parseObject(JSONObject.toJSONString(item), SeriesValue.class);
            double xv = NumberUtil.isNumber(plotValue.getXv()) ? Double.parseDouble(plotValue.getXv()) : 0d;
            double yv = NumberUtil.isNumber(plotValue.getYv()) ? Double.parseDouble(plotValue.getYv()) : 0d;
            data.add(xv, yv);
        });

        return dataset;
    }

    /**
     * 绘制图表
     * @param dataset 数据集
     * @return 图表
     */
    @Override
    public abstract JFreeChart createChart(DefaultCategoryDataset dataset);


    /**
     * 创建图表
     * @param requestDTO 源数据
     * @return 图片文件
     */
    public File drawChartFile(DrawChartRequestDTO requestDTO) {
        // 创建数据集
        this.requestDTO = requestDTO;

        DefaultCategoryDataset dataset = this.createDataset(this.requestDTO.getSourceData());
        // 绘制图表
        JFreeChart chart = this.createChart(dataset);
        // 生成图片
        return this.createChartImage(chart);
    }

}
